package main

func main() {
	/*
		1.基本概念：
			（1）Go语言是使用包来组织源代码的，并实现命名空间管理，任何源代码文件必须属于某个包。
			（2）源文件第一行有效代码必须是 package packageName 语句
			（3）一般包的名称就是其源文件所在目录的名称
			（4）包可以定义在很深的目录中，包的定义是不包括目录路径，但是包的引用一般是全路径引用
				例如：在 E:/src/a/b下定义一个包 c，在包 c 的源码中只需要声明为 package c，但是在“import”包 c 时，需要带上路径import "a/b/c"
			（5）包的习惯用法：
				a.包名一般是小写的，使用一个简短的命名
				b.包名一般要和所在的目录同名
				c.包名一般放在公司的域目录下，这样能够保证包名的唯一性，便于共享代码

		2.包引用
			（1）包的引用路径：
				A: 全路径引用
				B: 相对路径引用（go module下不可用）
			（2）包的引用格式
				标准引用方式：
					import "fmt"
				别名引用方式：
					import F "fmt"。
						用“F.”代替“fmt.”作为前缀引用fmt包内的可导出元素
				省略引用方式：
					import . "fmt"。
						相当于把包fmt的命名空间直接合并到当前程序的命名空间中，使用包fmt内可导出元素可以不用加前缀“fmt.”
				仅执行包初始化 init 函数
					import _"packageName"
						仅执行包的初始化函数，即使包没有 init 初始化函数，也不会引发编译器报错

			注意：
			（1）一个包可以有多个 init 函数，包加载会执行全部的 init 函数，但并不能保证执行顺序，所以不建议在一个包中放入多个 init 函数
			（2）包不能出现环形引用。
					比如 a 引用 b，b 引用 c，c 又引用 a。a --> b --> c --> a
			（3）包的重复引用是允许的。
					比如 a 引用了 b 和 c，b 和 c 都引用了 d。
						这种场景相当于重复引用了 d，Go编译器保证 d 的 init 函数只会执行一次
		3.包加载
			Go程序的启动/加载过程，在执行 main.main 之前，Go引导程序会先对整个程序的包进行初始化。

			Go包的初始化的特点：
			（1）包初始化程序从 main 函数引用的包开始，逐级查找包的引用，直到找到没有引用其他包的包，最终生成一个包引用的有向无环图
			（2）Go编译器会将有向无环图转换为一棵树，然后从树的叶子节点开始逐层向上对包进行初始化
			（3）单个包的初始化，先初始化常量，然后是全局变量，最后执行包的 init 函数（如果有的话）

		4.关于包的使用：
				1.一个目录下的统计文件归属一个包，package 的声明要一致
				2.package 声明的包和对应的目录名可以不一致，但习惯上还是写成一致的
				3.包可以嵌套
				4.同包下的函数不需要导入包，可以直接使用
				5.main包，main() 函数所在的包，其他的包不能使用这个名字
				6.导入包的时候，路径要从 src 下开始写

			main(),init()函数：
				0.两个函数都是go语言中的保留函数，init() 用于初始化信息，main() 用于作为程序的入口
				1.如果在 main() 函数中导入包，包中存在 init() 函数，那么 init() 函数会在 main() 函数执行前执行
				2.对于同一个go文件中的 init() 函数，调用顺序是从上到下的
				3.对于同一个 package 中的不同文件，将文件名按字符串进行“从小到大”排序，之后顺序调用各文件中的 init() 函数
				4.对于不同的的 package，
					A: 如果不相互依赖的话，按照 main 包中的 import 的顺序调用其包中的 init（）函数
					B: 如果package存在依赖，调用顺序为最后被依赖的最先被初始化(类似于递归函数，栈结构)
						例如：导入顺序 main -> A -> B -> C，则初始化顺序为C -> B -> A -> main,
							  一次执行对应的 init 方法，main包总是最后一个被初始化，因为它总是依赖别的包
				5.相同点：
					A: 在定义时，不能有任何的参数和返回值
					B: 只能有go 程序自动调用的，我们不能手动调用
				  不同点：
					A: init 可以应用于任意包，且可以重复定义多个
					B: main 函数只能用于 main包，且只能定义一个
				6.存在依赖的包之间，不能循环导入
					例如：A -> B -> C -> A (错误)
				7.一个包中可以被其他多个包 import，但是只能被初始化一次
				8._操作，其实是引入该包，而不直接使用包里面的函数，仅仅是调用了该包里的 init()

	*/
}
